/**
 * 处理 table 和 view 的特殊渲染
 *
 */

export const columnDataTransform = (arr) => {
  arr.forEach((v) => {
    v.label = v.title;

    // 对于table默认的一些配置项
    v.tooltip = true;
    v.ellipsis = true;

    if (v.type === 'select' || v.type === 'checkbox' || v.type === 'radio') {
      if (!v.slotName) {
        v.render = (data) => {
          let val = data.record[v.dataIndex];
          /**
           * 关于多选情况下的渲染特殊处理
           * 1.接口数据中返回的DtoList，直接将list中的值返回即可
           * 2.数据库存储的是id或者val值，那就需要
           */
          if (val instanceof Array && typeof val[0] === 'object') {
            return val.reduce(
              (a, b) => a + b[v.options?.label || 'value'] + ',',
              ''
            );
          } else if (v.type === 'checkbox') {
            let multipleValArr = val.split(',');
            let filterOptions = v.selectOptions.filter(
              (el) =>
                multipleValArr.indexOf(
                  el[v.options?.value || 'value'].toString()
                ) > -1
            );
            return filterOptions.reduce(
              (a, b) => a + ((a ? `,` : '') + b[v.options?.label || 'label']),
              ''
            );
          } else {
            // 这里就是普通的单选，根据val去找到对应key的值
            return (
              v.selectOptions.find(
                (el) =>
                  el[v.options?.value || 'value'].toString() === val.toString()
              )?.[v.options?.label || 'label'] || '-'
            );
          }
        };
      }
      v.renderView = (val) => {
        if (val instanceof Array && typeof val[0] === 'object') {
          return val.reduce(
            (a, b) => a + b[v.options?.label || 'value'] + ',',
            ''
          );
          // 多选的情况下需要逐一去查找label
        } else if (v.type === 'checkbox') {
          let multipleValArr = val.split(',');
          let filterOptions = v.selectOptions.filter(
            (el) =>
              multipleValArr.indexOf(
                el[v.options?.value || 'value'].toString()
              ) > -1
          );
          return filterOptions.reduce(
            (a, b) => a + ((a ? `,` : '') + b[v.options?.label || 'label']),
            ''
          );
        } else if (val) {
          return (
            v.selectOptions.find(
              (el) =>
                el[v.options?.value || 'value'].toString() === val.toString()
            )?.[v.options?.label || 'label'] || '-'
          );
        }
      };
    }
  });

  return arr;
};
